#include "NumereComplexe.h"

NumereComplexe::NumereComplexe()
{
  for(int i = 0; i < 100; i++)
      this->elemente[i] = Complex(0.0, 0.0);
}

NumereComplexe::NumereComplexe(NumereComplexe& v)
{//constructor de copiere
  for(int i = 0 ; i < 100 ; i++)
    this->elemente[i] = v.elemente[i];
}
NumereComplexe::NumereComplexe(NumereComplexe* v)
{//constructor de copiere
  for(int i = 0 ; i < 100 ; i++)
    this->elemente[i] = v->elemente[i];
}
NumereComplexe::~NumereComplexe()
{
  std::cout<<"Obiectul curent a fost distrus!";
}


int NumereComplexe::NumarElemente()
{
  return 100;
}

void NumereComplexe::OrdonareCrescatoare(NumereComplexe& v)
{
  Complex aux;
  for(int j = 99; j > 0 ; j--)
    for(int i = j -1 ; i > -1; i--)
      if(v.elemente[j] < v.elemente[i])
      {
        aux = v.elemente[j];
        v.elemente[j] = v.elemente[i];
        v.elemente[i] = aux;
      }
}

void NumereComplexe::OrdonareCrescatoare(NumereComplexe* v)
{
  Complex aux;
  for(int j = 99; j > 0 ; j--)
    for(int i = j -1 ; i > -1; i--)
      if(v->elemente[j] < v->elemente[i])
      {
        aux = v->elemente[j];
        v->elemente[j] = v->elemente[i];
        v->elemente[i] = aux;
      }
}

void NumereComplexe::OrdonareDescrescatoare(NumereComplexe& v)
{
  Complex aux;
  for(int j = 99; j > 0 ; j--)
    for(int i = j -1 ; i > -1; i--)
      if(v.elemente[j] > v.elemente[i])
      {
        aux = v.elemente[j];
        v.elemente[j] = v.elemente[i];
        v.elemente[i] = aux;
      }
}

void NumereComplexe::OrdonareDescrescatoare(NumereComplexe* v)
{
  Complex aux;
  for(int j = 99; j > 0 ; j--)
    for(int i = j -1 ; i > -1; i--)
      if(v->elemente[j] > v->elemente[i])
      {
        aux = v->elemente[j];
        v->elemente[j] = v->elemente[i];
        v->elemente[i] = aux;
      }
}


NumereComplexe NumereComplexe::operator+(const NumereComplexe& v)
{
  NumereComplexe aux;
  for(int i = 0; i < 100; i++)
    aux.elemente[i] = this->elemente[i] + v.elemente[i];
  return aux;
}

NumereComplexe NumereComplexe::operator+(const NumereComplexe* v)
{
  NumereComplexe aux;
  for(int i = 0; i < 100; i++)
    aux.elemente[i] = this->elemente[i] + v->elemente[i];
  return aux;
}

NumereComplexe NumereComplexe::operator-(const NumereComplexe& v)
{
  NumereComplexe aux;
  for(int i = 0; i < 100; i++)
    aux.elemente[i] = this->elemente[i] - v.elemente[i];
  return aux;
}

NumereComplexe NumereComplexe::operator-(const NumereComplexe* v)
{
  NumereComplexe aux;
  for(int i = 0; i < 100; i++)
    aux.elemente[i] = this->elemente[i] - v->elemente[i];
  return aux;
}

Complex NumereComplexe::operator*(NumereComplexe& v)
{
  Complex z1 = Complex(0.0, 0.0);
  for(int i = 0; i < 100; i++)
    z1 = z1 + this->elemente[i] * v.elemente[i];
  return z1;
}

Complex NumereComplexe::operator*(NumereComplexe* v)
{
  Complex z1 = Complex(0.0, 0.0);
  for(int i = 0; i < 100; i++)
    z1 = z1 + this->elemente[i] * v->elemente[i];
  return z1;
}

NumereComplexe NumereComplexe::crossProduct(const NumereComplexe &v1)
{
  NumereComplexe aux;
  for(int i = 0, j = 99; i < 100 && j > -1; i++, j--)
    aux.elemente[i] = this->elemente[i] * v1.elemente[j];
  return aux;
}

NumereComplexe NumereComplexe::crossProduct(const NumereComplexe* v1)
{
  NumereComplexe aux;
  for(int i = 0, j = 99; i < 100 && j > -1; i++, j--)
    aux.elemente[i] = this->elemente[i] * v1->elemente[j];
  return aux;
}

std::istream& operator>>(std::istream& input, NumereComplexe& v)
{
  std::cout<<"Citirea unui vector de numere complexe.\n";
  for(int i = 0; i < 100; i++)
    input>>v.elemente[i];
  return input;
}

std::ostream& operator<<(std::ostream& output, NumereComplexe v)
{
  for(int i = 0; i < 100; i++)
    output<<v.elemente[i]<<"  ";
  return output;
}

